package com.csl.jsonpreference.configdes

import android.text.TextUtils
import com.csl.jsonpreference.bean.ConfigTYPE
import com.csl.jsonpreference.tag.JsonConfig
import com.csl.jsonpreference.util.CLog
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type

/**
 * JsonConfig的可用实例(弥补注解无法实例化)
 */
open class JsonConfigIns {
    var key = ""
    open var describe = ""
    var title = ""
    var configType = ConfigTYPE.TXT
    var index = 999
    var values : ArrayList<String>? = null
    var listType: Class<*> = String::class.java
    var valueStr = ""




    constructor(key: String,title: String, discribe: String, type: ConfigTYPE) {
        this.key = key
        this.title = title
        this.describe = discribe
        this.configType = type
    }

    constructor(config: JsonConfig?) {
        setForJsonConfig(config)
    }
    constructor(config: JsonConfigIns) {
        key = config.key
        describe = config.describe
        configType = config.configType
        index = config.index
        title = config.title
        listType = config.listType
        valueStr = config.valueStr
        if(config.values?.isNotEmpty() == true) {
            values = ArrayList()
            values!!.addAll(config.values!!)
        }
    }


    fun setForJsonConfig(config: JsonConfig?): JsonConfigIns {
        if (config != null) {
            key = config.key
            describe = config.describe
            configType = config.type
            index = config.index
            title = config.title
            listType = config.listType.java
            valueStr = config.valueStr
            if(config.values.isNotEmpty()) {
                values = ArrayList()
                values!!.addAll(config.values)
            }
        }
        return this
    }

    /**
     * 当前非默认值的使用新配置覆盖
     */
    fun replaceDefaultConfig(config: JsonConfig?) : JsonConfigIns {
        if(config != null) {
            if(TextUtils.isEmpty(key)) {
                key = config.key
            }
            if(TextUtils.isEmpty(describe)) {
                describe = config.describe
            }
            if(configType == ConfigTYPE.AUTO) {
                configType = config.type
            }
            if(index == 999) {
                index = config.index
            }
            if(TextUtils.isEmpty(title)) {
                title = config.title
            }
            if(listType == String::class.java) {
                listType = config.listType.java
            }
            if(TextUtils.isEmpty(valueStr)) {
                valueStr = config.valueStr
            }
            if(values.isNullOrEmpty()) {
                values = ArrayList()
                values!!.addAll(config.values)
            }
        }
        return this
    }

    fun setType(configType: ConfigTYPE) {
        this.configType = configType
    }

    override fun toString(): String {
        return "JsonConfigIns(key='$key', describe='$describe', title='$title', configType=$configType, index=$index, values=$values, valuestr=$valueStr)"
    }

    fun isArrayType(clazz: Class<*>? = null): Boolean {
        return when (configType) {
//            ConfigTYPE.ARRAY_TXT,
//            ConfigTYPE.ARRAY_NUMBER,
//            ConfigTYPE.ARRAY_BOOLEAN,
//            ConfigTYPE.ARRAY_FLOAT,
            ConfigTYPE.ARRAY_OBJECT -> true
            ConfigTYPE.AUTO -> {
                var a1 = clazz?.genericInterfaces
                var a2 = clazz?.interfaces
                true == clazz?.isArray
                    || true == List::class.java.isAssignableFrom(clazz)//?.isAssignableFrom(List::class.java)
                    || true == java.util.List::class.java.isAssignableFrom(clazz)//clazz?.isAssignableFrom(java.util.List::class.java)
            }
            else -> false
        }
    }


        open fun getParseValueStr(): String {
            return valueStr
        }


}
